﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NUnit.Framework;
using Spring.Context;
using Spring.Context.Support;
using SistemaDeBastanteodePoderes.Negocio;
using SistemaDeBastanteodePoderes.Dominio;
using SistemaDeBastanteodePoderes.Persistencia;

namespace SistemaDeBastanteodePoderes.Pruebas.Negocio
{
     [TestFixture]
    public class Test_H7_AdministradorService
    {
        IApplicationContext Spring = null;
        IAdministradorService Service = null;
        Usuario usuarioRegistrado = null;
        Roles rolCreado = null;
        string valoractual = string.Empty;
        IUsuarioDAO usuarioDAO = null;
        IRolesDAO rolDAO = null;
        [TestFixtureSetUp]
        public void InicioPruebas()
        {
            Spring = new XmlApplicationContext(
                "assembly://SistemaDeBastanteodePoderes/SistemaDeBastanteodePoderes/capaPersistencia.xml",
                "assembly://SistemaDeBastanteodePoderes/SistemaDeBastanteodePoderes/capaNegocio.xml"
                );
            Service = (IAdministradorService)Spring.GetObject("administradorService");
            rolCreado = ((IRolesDAO)Spring.GetObject("rolesDAO_NH")).Crear(new Roles() { Descripcion = "ABOGADO" });

        }

        [Test]
        public void Test1_Encriptar()
        {


            string claveUsuario = "P@ssword";
          
            string encriptesperada = "382e0360e4eb7b70034fbaa69bec5786";
           
           
            
            valoractual = Encriptacion.GetMD5(claveUsuario);

            Assert.IsTrue(!string.IsNullOrEmpty(valoractual));
     
            Assert.AreEqual(encriptesperada, valoractual);
        }

        [Test]
        public void Test2_RegistrarUsuario_DatosInsuficientes()
        {
            Assert.Catch<DatosInsuficientesException>(delegate
            {
                usuarioRegistrado = Service.RegistrarUsuario(null, valoractual, rolCreado.Codigo);
            });
        }

        [Test]
        public void Test3_RegistrarUsuario_OK()
        {

            Assert.DoesNotThrow(delegate
            {
                usuarioRegistrado = Service.RegistrarUsuario("LUCERO", "876539002", rolCreado.Codigo);
            });

            Assert.IsNotNull(usuarioRegistrado);
            Assert.Greater(usuarioRegistrado.Codigo, 0);
            Assert.AreEqual(usuarioRegistrado.Nombre, "LUCERO");
            Assert.AreEqual(usuarioRegistrado.Password, "876539002");
            Assert.AreEqual(usuarioRegistrado.Rol.Codigo, rolCreado.Codigo);
           
        }

        [Test]
        public void Test4_RegistrarUsuario_NombreRepetido()
        {

            Usuario usuarioRep = null;
            Assert.Catch<EntidadRepetidaException>(delegate
              {
                  Service.RegistrarUsuario("LUCERO", "876539002", rolCreado.Codigo);
              });

            Assert.IsNull(usuarioRep);


        }
           [Test]
        public void Test5_ControlarUsuario()
              

        {
            //int Rol = int.Parse(rolCreado.Codigo);
            Service.ObtenerUsuario(1);
           
            // 1. Validar que se listen los usuarios existentes exitosamente
            ICollection<Usuario> usuariosExistentes = null;
            Assert.DoesNotThrow(delegate
            {
                usuariosExistentes = Service.ListarUsuarios();
            });
            // 2. Validar que se retornen al menos los 2 usuarios creados previamente
            Assert.GreaterOrEqual(usuariosExistentes.Count,1);
            // 3. Validar que cada usuario obtenido tenga un nombre no nulo
            
            
            foreach (Usuario usuario in usuariosExistentes)
                Assert.IsNotNull(usuario.Nombre);
            ////throw new ControldeUsuario("Usuario con Rol de: ");
            
        }

        [TestFixtureTearDown]
        public void FinalizarPruebas()
        {

         

            ((IUsuarioDAO)Spring.GetObject("usuarioDAO_NH")).Eliminar(usuarioRegistrado);

            ((IRolesDAO)Spring.GetObject("rolesDAO_NH")).Eliminar(rolCreado);
            Spring.Dispose();
            Spring = null;
        }

    }
}